/*
 * Tencent is pleased to support the open source community by making BK-JOB生物智算平台 available.
 *
 * Copyright (C) 2021 THL A29 Limited, a Tencent company.  All rights reserved.
 *
 * BK-JOB生物智算平台 is licensed under the MIT License.
 *
 * License for BK-JOB生物智算平台:
 *
 * ---------------------------------------------------
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
 * documentation files (the "Software"), to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
 * to permit persons to whom the Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of
 * the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
 * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 * IN THE SOFTWARE.
 */

import Cookie from "js-cookie";
import { analysisCommand, sTc } from "./business";

import UserModel from "@model/user";
export const defaultValue = (value) => value || "--";

/**
 * @desc 生成默认名称
 * @param { String } prefixStr 名称前缀
 * @returns { String }
 */
export const genDefaultName = (prefixStr = "auto") => {
  const formatStr = (str) => {
    if (String(str).length === 1) {
      return `0${str}`;
    }
    return str;
  };
  const d = new Date();
  const month = d.getMonth() + 1;

  const temp = [
    d.getFullYear(),
    formatStr(month),
    formatStr(d.getDate()),
    formatStr(d.getHours()),
    formatStr(d.getMinutes()),
    formatStr(d.getSeconds()),
    d.getMilliseconds(),
  ];
  const timestamp = new Date().getTime();
  const { username } = Object.freeze(
    new UserModel({ username: Cookie.get("job_user") })
  );
  // return `${prefixStr}_${temp.join('')}`;
  return `${
    window.PROJECT_CONFIG.SCOPE_ID_NAME || prefixStr
  }_${username}_${timestamp}`;
};

export const getUserInfor = () => {
  const scopeName = `${window.PROJECT_CONFIG.SCOPE_ID_NAME}`;
  const { username } = Object.freeze(
    new UserModel({ username: Cookie.get("job_user") })
  );
  return { scopeName, username };
};
const replaceLastSegment = (string, newString) => {
  return string.replace(/_([^_]+)$/, `_${newString}`);
};

export const updateTimeStamp = (step = {}, stepNum = "") => {
  const stepN = stepNum == "" ? "" : `_${parseInt(stepNum) + 1}`;
  // analysisCommand, sTc
  const timestamp = new Date().getTime();
  const scopeName = `${window.PROJECT_CONFIG.SCOPE_ID_NAME}`;
  const { username } = Object.freeze(
    new UserModel({ username: Cookie.get("job_user") })
  );
  const { name, scriptStepInfo } = step;

  let baseInfo = { timestamp, scopeName };
  const oldTimeStamp = name.split("_").reverse()[0]; //旧时间
  const newName = name
    .split(`${scopeName}_`)[1]
    .split(`_${oldTimeStamp}`)[0]
    .split("_");
  baseInfo = {
    ...baseInfo,
    modelByUser: newName[0],
    modelByName: newName.slice(1).join("_"),
  };

  // 更新步骤名称时间戳
  // 更新执行账号 保持用户名为当前登录的账号
  step["name"] = replaceLastSegment(step["name"], timestamp + stepN).replace(
    newName[0],
    username
  );

  const { scriptParam } = scriptStepInfo || {};
  const { jobName, logPath } = analysisCommand(scriptParam);
  // logPath时间戳
  const oldLogPathTimeStamp = logPath.split("logs/")[1].split("/")[0];
  const logPathTimeStamp = replaceLastSegment(
    logPath.split("logs/")[1].split("/")[0],
    timestamp + stepN
  );
  // 更新jobName时间戳
  step["scriptStepInfo"]["scriptParam"] = step["scriptStepInfo"]["scriptParam"]
    .replace(jobName, step["name"])
    .replace(oldLogPathTimeStamp, logPathTimeStamp)
    .replace(`/${newName[0]}/logs`, `/${username}/logs`);

  step["slurm"] = { ...step["slurm"], baseInfo };
  return step;
};

export const getDefaultName = () => {
  const { username } = Object.freeze(
    new UserModel({ username: Cookie.get("job_user") })
  );
  return {
    timestamp: new Date().getTime(),
    scopeName: `${window.PROJECT_CONFIG.SCOPE_ID_NAME}`,
    modelByUser: username,
    modelByName: "",
  };
};
/**
 * @desc 生成默认工作路径
 * @param { String } prefixStr 工作路径
 * @returns { String }
 */
export const workDirName = "/gpfs/jianmucloud/home/";
export const genDefaultWorkDir = (prefixStr = workDirName) => {
  const { username } = Object.freeze(
    new UserModel({ username: Cookie.get("job_user") })
  );
  return `${prefixStr}${
    window.PROJECT_CONFIG.SCOPE_ID_NAME || prefixStr
  }/${username}/`;
};
export const genTargetPath = (prefixStr = workDirName) => {
  const { username } = Object.freeze(
    new UserModel({ username: Cookie.get("job_user") })
  );
  return `${prefixStr}${
    window.PROJECT_CONFIG.SCOPE_ID_NAME || prefixStr
  }/${username}/`;
};

/**
 * @desc 生成默认脚本版本号
 * @returns { String }
 */
export const genDefaultScriptVersion = () => {
  const uid = Cookie.get("job_user");
  const formatStr = (str) => {
    if (String(str).length === 1) {
      return `0${str}`;
    }
    return str;
  };
  const d = new Date();

  const month = formatStr(d.getMonth() + 1);
  const date = formatStr(d.getDate());
  const hours = formatStr(d.getHours());
  const minutes = formatStr(d.getMinutes());
  const seconds = formatStr(d.getSeconds());
  const millSeconds = formatStr(d.getMilliseconds());

  const temp = [
    d.getFullYear(),
    month,
    date,
    hours,
    minutes,
    seconds,
    millSeconds,
  ];

  return `${uid}.${temp.join("")}`.slice(0, 30);
};
